package server

import (
	"context"
	"fmt"
	"net"

	pb "raftique/network/proto"

	"google.golang.org/grpc"
)

// RaftServer 实现 RaftService 服务
type RaftServer struct {
	pb.UnimplementedRaftServiceServer
	server *grpc.Server
	port   int
}

// NewRaftServer 创建一个新的 Raft 服务器
func NewRaftServer(port int) *RaftServer {
	return &RaftServer{
		server: grpc.NewServer(),
		port:   port,
	}
}

// Start 启动服务器
func (s *RaftServer) Start() error {
	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", s.port))
	if err != nil {
		return fmt.Errorf("failed to listen: %v", err)
	}

	pb.RegisterRaftServiceServer(s.server, s)

	if err := s.server.Serve(lis); err != nil {
		return fmt.Errorf("failed to serve: %v", err)
	}

	return nil
}

// Stop 停止服务器
func (s *RaftServer) Stop() {
	if s.server != nil {
		s.server.GracefulStop()
	}
}

// AppendEntries 实现追加日志条目 RPC
func (s *RaftServer) AppendEntries(ctx context.Context, req *pb.AppendEntriesRequest) (*pb.AppendEntriesResponse, error) {
	// TODO: 实现日志追加逻辑
	return &pb.AppendEntriesResponse{
		Term:    req.Term,
		Success: true,
	}, nil
}

// RequestVote 实现请求投票 RPC
func (s *RaftServer) RequestVote(ctx context.Context, req *pb.RequestVoteRequest) (*pb.RequestVoteResponse, error) {
	// TODO: 实现投票逻辑
	return &pb.RequestVoteResponse{
		Term:        req.Term,
		VoteGranted: true,
	}, nil
}

// InstallSnapshot 实现安装快照 RPC
func (s *RaftServer) InstallSnapshot(ctx context.Context, req *pb.InstallSnapshotRequest) (*pb.InstallSnapshotResponse, error) {
	// TODO: 实现快照安装逻辑
	return &pb.InstallSnapshotResponse{
		Term: req.Term,
	}, nil
}
